﻿package com.Galaxisfarm {
	// Bibliotecas da game engine Flixel
	import com.adamatomic.flixel.*;
	import flash.geom.Point;
	
	public class PhaseFourthState extends PhaseState {
		// Variável que indica se houver colisão
		private var _has_overlap:Boolean;
		// Esterqueira
		private var _midden_phase:Midden;
		
		// Método construtor
		public function PhaseFourthState():void {
			// Chama o construtor da classe herdada
			super();
			
			// Roda o script lua
			runScriptLua("phase_fourth.lua");
			
			// Adiciona o celeiro
			addCowshed();
			
			// Adiciona o curral
			addFreestall();
			
			// Mensagem de instrução
			dialogBoxDefault("Fase 4\nSeu objetivo é construir a esterqueira.");
			
			// Animações da esterqueira
			_midden_phase = new Midden(20, 20, FlxG.mouse);
			_midden_phase.visible = false;
			_lyr_sprites.add(_midden_phase);
			
			// Cria o celeiro e deixa oculto
			createMiddenHidden();
			
			addVersionBeta();
		}
		
		// Método chamado constantemente
		override public function update():void {
			super.update();
			
			// Verifica se a esterqueira acabou de ser
			// adicionado no cenário
			var addMiddenNow:Boolean = false;
			
			// Verifica se o botão para adicionar
			// a esterqueira foi criado
			if (_button_add_midden != null) {
				// Verifica se o botão foi pressionado
				if (_button_add_midden.on()) {
					// Esterqueira já foi criada
					if (_midden.visible) {
						// Remove a esterqueira
						_midden.visible = false;
						
						// Aumenta o valor da esterqueira no dinheiro
						Farm.setMoney(Farm.getMoney() + getMiddenPrice());
					} else {
						// Obtém as árvores criadas
						var trees:FlxArray = Farm.getTrees();
					
						// Verifica se houve colisão
						_has_overlap = false;
						for each (var tree:* in trees) {
							for each (var midden_point:Point in _midden_phase.getCollidePoints()) {
								if (tree.overlapsPoint(midden_point.x, midden_point.y, false)) {
									_has_overlap = true;
									break;
								}
							}
						}
					
						if (!_has_overlap) {
							// Verifica se existe colisão com o painel de ação
							if (_action_panel != null) {
								if (_midden_phase.overlaps(_action_panel)) {
									_has_overlap = true;
								}
							}
							
							// Verifica se existe colisão com o celeiro
							if (_midden_phase.overlaps(_cowshed)) {
								for each (midden_point in _midden_phase.getCollidePoints()) {
									if (_cowshed.overlapsPoint(midden_point.x, midden_point.y, true)) {
										_has_overlap = true;
										break;
									}
								}
							}
							
							// Verifica se existe colisão com o curral
							if (_midden_phase.overlaps(_freestall)) {
								for each (midden_point in _midden_phase.getCollidePoints()) {
									if (_freestall.overlapsPoint(midden_point.x, midden_point.y, true)) {
										_has_overlap = true;
										break;
									}
								}
							}
						}
						
						// Exibe o curso com a esterqueira
						// no caso de colisão ou não
						if (_has_overlap) {
							_midden_phase.play("not");
						} else {
							_midden_phase.play("selected");
						}
						_midden_phase.visible = true;
						
						// Captura o click do mouse
						// e não houve colisão do celeiro com as árvores
						if (FlxG.justPressed(FlxG.MOUSE) && !_has_overlap) {
							if (!_midden.visible) {
								// Verifica se tem dinheiro suficiente para construir a esterqueira
								if ((Farm.getMoney() - getMiddenPrice()) > 0) {
									_midden.x = _midden_phase.x;
									_midden.y = _midden_phase.y;
									_midden.visible = true;
									_button_add_midden.switchOff();
									addMiddenNow = true;
									
									// Diminui o valor da esterqueira no dinheiro
									Farm.setMoney(Farm.getMoney() - getMiddenPrice());
								} else {
									// Exibe mensagem de dinheiro insuficiente
									dialogBoxError("Você não possui dinheiro\nsuficiente para construir\na esterqueira.");
								}
							}
						}
						
						// Atualiza posição do sprite pelo deslocamento do mouse
						_midden_phase.updatePositionByMouse();
					}
				} else {
					// Se o botão não estiver pressionado
					// esconde os cursores do mouse
					_midden_phase.visible = false;
				}
			}
			
			// Verifica se o foi clicado na esterqueira
			// para mudar a sua posição
			if (!addMiddenNow) {
				if (FlxG.justPressed(FlxG.MOUSE) && _midden.visible && _midden.overlapsPoint(FlxG.mouse.x, FlxG.mouse.y)) {
					_button_add_midden.switchOn();
					_midden.visible = false;
					
					// Aumenta o valor da esterqueira no dinheiro
					Farm.setMoney(Farm.getMoney() + getMiddenPrice());
				}
			}
		}
		
		// Método que cria o botão concluído
		public function createButtonCompleted(X:uint, Y:uint):void {
			var buttonCompleted:FlxButton = new FlxButton(
				X, 
				Y, 
				new FlxSprite(null, 0, 0, false, false, 65, 18, 0xff25155E), 
				onClickButtonCompleted, 
				new FlxSprite(null, 0, 0, false, false, 65, 18, 0xffE46713), 
				new FlxText(0, 1, 65, 18, "Concluído", 0xffffff, null, 10, "center"),
				new FlxText(0, 1, 65, 18, "Concluído", 0xffffff, null, 10, "center"));
			_lyr_sprites.add(buttonCompleted);
		}
		
		// Método chamado quando o botão de
		// concluído é clicado
		private function onClickButtonCompleted():void {
			// Verifica se foi construído o curral
			if (!_midden.visible) {
				dialogBoxError("Você deve construir a esterqueira.");
			} else {
				// Define o curral na fazenda
				Farm.setMidden(_midden);
				
				// Vai para terceira fase
				FlxG.switchState(PhaseFifthState);
			}
		}
	}
}